"use strict";
// 写ts 语法
// ts 是一门强类型语言
// 数据类型:
// 01: number 类型
let a = 100;
// console.log(a);
//02: boolean 
let b = true;
// console.log(b);
// 03: string
let c = '100';
// 04: null
let d = null;
//05:undefined 
let e = undefined;
//06: void 类型, 表示没有类型
// 一般用于函数的返回值
function fn() {
    return;
}
const fn1 = () => {
};
//07: any 类型
// 任何类型 值可以为任意类型
let f = [{}];
// 08: unknown 未知类型
// 当你使用一个unkonwn 类型的时候, 开发者不知道后面值是什么类型,
// 这时候就使用unknown
let g = '';
// 09: never 类型
// 表示从来不会出现的类型
// function loop(): never {
//     while (true) { }
// }
// 10. 数组类型
// 声明数组的第一种方式: 字面量方式
const arr = ['a', 'b'];
// 声明数组的第二种方式: 泛型方式
const arr1 = [{}, true, '', []];
//11. 元祖类型
// 特殊的数组类型
let arr3 = ['', {}, []];
//12.object 类型
let obj = {
    name: ''
};
// 13. 枚举类型
// 枚举类型 表示将类型约定在一个范围内, 使用类型时只能使用枚举范围内的类型
// enum Sex {
//     male = '男',
//     female = '女',
//     unknown = '未知'
// }
// console.log('Sex', Sex);
// let zhaozhilong: Sex = Sex.male
// console.log('zhaozhilong', zhaozhilong);
// 14. 联合类型
let h = 100;
// 15.Symbol类型
// 该类型是es6新增的一个类型, 特点: 不可以变且唯一
// 一般作为对象的key 使用
// let sym1 = Symbol();
// let sym2 = Symbol();
// console.log(sym1 == sym2);  // false
// let obj1 = {
//     [sym2]: '张三'
// }
// console.log(obj1[sym2]);
// 16. ts中使用函数
// 函数参数的类型 有3类
// 01: 可选参数  表示该实参可传可不传
// 02: 默认参数  表示如果实参不传, 形参就是使用默认值
// 03: 剩余参数  表示当实参的数量大于形参的数量,就会将剩余参数统一放在一个数组中接收
function fn2(m, n, k = ['1', 100], ...arr5) {
    //console.log('k', k);
    // console.log('arr5', arr5);
    return m;
}
// 调用函数
// fn2('小丽')
// fn2('小丽', undefined, ['a', 'b'])
fn2('a', 10, [1, 2, 3], '安琛', 18, '男', '女');
// T extends scopeType 泛型约束
class liangshan {
    constructor() {
        this.heroArr = [];
    }
    push(name) {
        this.heroArr.push(name);
    }
}
let shuiboliangshan = new liangshan();
shuiboliangshan.push('晁盖');
shuiboliangshan.push('及时雨-宋江');
shuiboliangshan.push('玉麒麟-卢俊义');
shuiboliangshan.push(true);
// shuiboliangshan.push(null)
// shuiboliangshan.push({})
console.log(shuiboliangshan);
